package model;

public class Matriz {

	private int m,n;
	private double[][] valor;
	
	public Matriz(int m,int n) {
		valor=new double[m][n];
		this.m=m;
		this.n=n;
	}
	
	public Matriz(int m) {
		valor=new double[m][1];
		this.m=m;
		this.n=1;
	}

	public int getM() {
		return m;
	}

	public int getN() {
		return n;
	}

	public double getValor(int i,int j){
		return this.valor[i][j];
	}
	
	public void setValor(int i, int j, double valor){
		this.valor[i][j]=valor;
	}
	
	public double getValor(int i){
		return this.valor[i][0];
	}
	
	public void setValor(int i,double valor){
		this.valor[i][0]=valor;
	}
	
	public void imprimir(){
		for(int i=0;i<m;i++){
			for(int j=0;j<n;j++){
				if(this.valor[i][j]>=0){
					System.out.printf("%.4f",this.valor[i][j]);
				}else{
					System.out.printf("%.3f",this.valor[i][j]);
				}
				System.out.print(" ");
			}
			System.out.println();
		}
	}
	
	public Matriz inversa(){
		Matriz inversa=new Matriz(2,2);
		double determinante=this.getValor(1, 1)*this.getValor(0, 0)-this.getValor(0, 1)*this.getValor(1, 0);
		for(int i=0;i<m;i++){
			for(int j=0;j<n;j++){
				inversa.setValor(0, 0, this.getValor(1, 1)*(1/determinante));
				inversa.setValor(1, 1, this.getValor(0, 0)*(1/determinante));
				inversa.setValor(0, 1, -1*this.getValor(0, 1)*(1/determinante));
				inversa.setValor(1, 0, -1*this.getValor(1, 0)*(1/determinante));
			}
		}
		return inversa;
	}
	
	public Matriz transposta(){
		Matriz transposta=new Matriz(this.getN(),this.getM());
		for(int i=0;i<transposta.getM();i++){
			for(int j=0;j<transposta.getN();j++){
				transposta.setValor(i, j, this.getValor(j, i));
			}
		}
		return transposta;
	}
	
	public static Matriz multiplicacao(Matriz matriz1,Matriz matriz2){
		Matriz resultado=new Matriz(matriz1.getM(),matriz2.getN());
		for(int i=0;i<resultado.getM();i++){
			for(int j=0;j<resultado.getN();j++){
				for(int k=0;k<matriz1.getN();k++){
					resultado.setValor(i, j, resultado.getValor(i, j)+matriz1.getValor(i, k)*matriz2.getValor(k, j));
				}
			}
		}
		return resultado;
	}
	
	public void escala(double escala){
		for(int i=0;i<this.getM();i++){
			for(int j=0;j<this.getN();j++){
				this.setValor(i, j, this.getValor(i, j)*escala);
			}
		}
	}
	
	public double determinanteQuadrada(){
		double determinante=this.getValor(1, 1)*this.getValor(0, 0)-this.getValor(0, 1)*this.getValor(1, 0);
		return determinante;
	}
	
	public static Matriz soma(Matriz matriz1,Matriz matriz2){
		Matriz resultado=new Matriz(matriz1.getM(),matriz2.getN());
		for(int i=0;i<matriz1.getM();i++){
			for(int j=0;j<matriz2.getN();j++){
				resultado.setValor(i, j, matriz1.getValor(i,j)+matriz2.getValor(i, j));
			}
		}
		return resultado;
	}
}
